package com.cn.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.cn.bean.SimpleList;
import com.cn.bean.SimpleMap;
import com.cn.dao.model.TableBean;

/**
 * @author sushy
 * @date 2016-3-23 
 */
public interface JdbcDao extends IJdbc{

	public final static String tableSuffix = "\\$tableSuffix\\$";
	public final static String sysDateSql = "SELECT SYSDATE FROM DUAL";
	public final static SimpleMap emptyMap = new SimpleMap(1);
	public final static List<?> emptyList = new ArrayList<Object>(1);
	public final static RowSet emptyRowSet = new RowSet();
	
	public DataSource getDataSource();

	public void setDataSource(DataSource dataSource);

	/**
	 * 执行SQL
	 * 
	 * @param sql
	 * @param param
	 * @return
	 */
	public int execSql(String sql, SimpleMap param);

	/**
	 * 执行SQL
	 * 
	 * @param sql
	 * @param param
	 */
	public int execSql(String sql, SimpleList param);

	/**
	 * 执行SQL
	 * 
	 * @param sql
	 * @return
	 */
	public int execSql(String sql);

	/**
	 * 输入查询SQL进行查询
	 * 
	 * @param sql
	 * @param rch
	 */
	public void query(String sql, RowCallbackHandler rch);

	/**
	 * 输入查询SQL和绑定变量进行查询
	 * 
	 * @param sql
	 * @param param
	 * @param rch
	 */
	public void query(String sql, SimpleMap param, RowCallbackHandler rch);

	/**
	 * 输入查询SQL和绑定变量进行查询
	 * 
	 * @param sql
	 * @param param
	 * @param rch
	 */
	public void query(String sql, SimpleList param, RowCallbackHandler rch);

	/**
	 * 输入查询SQL和绑定变量进行查询
	 * 
	 * @param sql
	 * @param param
	 *            (绑定参数按:别名定义)
	 * @return 记录集
	 */
	public RowSet query(String sql, SimpleMap param);

	/**
	 * 输入查询SQL和绑定变量进行查询
	 * 
	 * @param sql
	 * @param param
	 *            (绑定变量参数数量必须一致)
	 * @return 记录集
	 */
	public RowSet query(String sql, SimpleList param);

	/**
	 * 查询sql
	 * 
	 * @param sql
	 * @return
	 */
	public RowSet query(String sql);

	/**
	 * 批量取序列(至少会返回一个)
	 * 
	 * @return
	 */
	public List<Long> getSeqID(String seqName, int num);

	/**
	 * 查询序列
	 * 
	 * @return
	 */
	public long getSeqID(String seqName);

	/**
	 * 查询系统时间
	 * 
	 * @return
	 */
	public Date getSysDate();

	/**
	 * 单表新增操作
	 * 
	 * @param objBean
	 * @return
	 */
	public int insert(TableBean objBean);

	/**
	 * 单表更新操作
	 * 
	 * @param objBean
	 * @return
	 */
	public int update(TableBean objBean);

	/**
	 * 单表更新操作
	 * 
	 * @param objBean
	 * @return
	 */
	public int update(BaseMapper<?> mapper, SqlParam sqlParam);

	/**
	 * 单表删除操作
	 * 
	 * @param objBean
	 * @return
	 */
	public int delete(TableBean objBean);

	/**
	 * 单表删除操作
	 * 
	 * @param objBean
	 * @return
	 */
	public int delete(BaseMapper<?> mapper, SqlParam sqlParam);

	/**
	 * 拼接SQL查询操作
	 * 
	 * @param sqlParam
	 * @return
	 */
	public void query(SqlParam sqlParam, RowCallbackHandler rch);

	/**
	 * 拼接SQL查询操作
	 * 
	 * @param sqlParam
	 * @return
	 */
	public RowSet query(SqlParam sqlParam);

	/**
	 * 拼接SQL查询操作
	 * 
	 * @param sqlParam
	 * @return
	 */
	public List<?> queryForList(SqlParam sqlParam);

	/**
	 * 单表查询操作
	 * 
	 * @param mapper
	 * @param sqlParam
	 * @return
	 */
	public RowSet query(BaseMapper<?> mapper, SqlParam sqlParam);

	/**
	 * 单表查询操作
	 * 
	 * @param <T>
	 * 
	 * @param mapper
	 * @param sqlParam
	 * @return
	 */
	public <T extends TableBean> T selectFirstRow(BaseMapper<T> mapper,
			SqlParam sqlParam);

	/**
	 * 单表查询操作
	 * 
	 * @param <T>
	 * 
	 * @param mapper
	 * @param sqlParam
	 * @return
	 */
	public <T extends TableBean> List<T> select(BaseMapper<T> mapper,
			SqlParam sqlParam);

	/**
	 * 批量新增
	 * 
	 * @param beans
	 */
	public <T extends TableBean> void batchInsert(BaseMapper<T> mapper,
			List<T> beans);

	/**
	 * 批量更新
	 * 
	 * @param beans
	 */
	public <T extends TableBean> void batchUpdate(BaseMapper<T> mapper,
			List<T> beans);

	/**
	 * 批量删除
	 * 
	 * @param beans
	 */
	public <T extends TableBean> void batchDelete(BaseMapper<T> mapper,
			List<T> beans);

	/**
	 * 批量更新(适用单SQL语句批量操作)
	 * 
	 * @param values
	 */
	public void batchUpdate(String sql, List<?> values);

	/**
	 * 查询返回一行0..1列
	 * 
	 * @param sqlParam
	 * @return
	 */
	public String queryForString(SqlParam sqlParam);

	/**
	 * 查询返回一行0..1列
	 * 
	 * @param sqlParam
	 * @return
	 */
	public long queryForLong(SqlParam sqlParam);

	/**
	 * 调用存储过程
	 * 
	 * @param sql
	 */
	public void callProcedure(String callString);
	
	/**
	 * 调用存储过程
	 * 
	 * @param sql
	 */
	public Object callProcedure(String callString,
			CallableStatementCallback<?> action);

}
